#include <jni.h>
#include <string.h>
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#include "utils/util.h"
extern "C" {
/*
 * 方法名称规定 : Java_完整包名类名_方法名()
 * JNIEnv 指针
 *
 * 参数介绍 :
 * env : 代表Java环境, 通过这个环境可以调用Java中的方法
 * thiz : 代表调用JNI方法的对象, 即MainActivity对象
 * com.example.testjni
 */
jstring Java_com_example_testjni_JniUtil_testHelloJni(JNIEnv *env,
		jobject thiz) {
	/*
	 * 调用 android-ndk-r9c\platforms\android-8\arch-arm\usr\include 中jni.h中的方法
	 * jni.h 中定义的方法  jstring (*NewStringUTF)(JNIEnv*, const char*);
	 */
	return env->NewStringUTF("hello world jni");
}

jstring Java_com_example_testjni_JniUtil_testAppendString(JNIEnv *env,
		jobject thiz, jstring str) {
	char *p = (char*) Util::jstring2CStr(env, str);
	//打印Java传递过来的数据
	LOGI("Java JNI string parameter is : %s", p);
	char *append = "append";
	//strcat(dest, source) 函数可以将source字符串 添加到dest字符串后面
	return env->NewStringUTF(strcat(p, append));
}

jstring Java_com_example_testjni_JniUtil_testStaticAppendString(JNIEnv *env,
		jclass clazz, jstring str) {
	char *p = (char*) Util::jstring2CStr(env, str);
	//打印Java传递过来的数据
	LOGI("Java JNI string parameter is : %s", p);
	char *append = "append";
	//strcat(dest, source) 函数可以将source字符串 添加到dest字符串后面
	return env->NewStringUTF(strcat(p, append));
}
jint Java_com_example_testjni_JniUtil_testSendIr(JNIEnv *env, jobject cls,
		jint frequency, jintArray pattern) {
	jsize len = env->GetArrayLength(pattern);
	int* patternArray = env->GetIntArrayElements(pattern, NULL);

	__android_log_print(ANDROID_LOG_INFO, "TRUSS", "frequency=%d\n", frequency);

	int newPatternArrayLen = len + 1;
	int newPatternArray[newPatternArrayLen];
	newPatternArray[0] = frequency;
	int i = 0;
	for (; i < len; i++) {
		newPatternArray[i + 1] = patternArray[i];
	}
	int* newPatternArrayPtr = newPatternArray;
	// print
	i = 0;
	for (; i < newPatternArrayLen; i++) {
		__android_log_print(ANDROID_LOG_INFO, "TRUSS",
				"newPatternArrayPtr[%d]=%d\n", i, newPatternArrayPtr[i]);
	}

	env->ReleaseIntArrayElements(pattern, patternArray, JNI_ABORT);
	return frequency;
}
}
